﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Problem2
{
    class Program
    {
        
        static void Main(string[] args)
        {
            
            figura[] figuras = new figura[12];
            for(int i=1;i<13;i++)
            {
                figura fig1 = new figura(i);
                figuras[i - 1] = fig1;
            }
            
            
            Tablero tab = new Tablero();
            coordenadas coord = new coordenadas(0, 0);
            int cantSoluciones = 0;
            HashSet<String> soluciones = new HashSet<string>();
            coordenadas coord1 = new coordenadas(2, 0);
            figura fig = new figura(8);
            coordenadas[][] piezasEnTablero = new coordenadas[12][];
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0],coord1,8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            int index = 0;
            //Console.WriteLine("So far[" + index + "]: " + cantSoluciones);
            int guardo = cantSoluciones;
            index++;
            coord1 = new coordenadas(1, 1);
            tab.pullFichaV2(piezasEnTablero[7]);
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0], coord1, 8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            //Console.WriteLine("So far[" + index + "]: " + (cantSoluciones-guardo));
            guardo = cantSoluciones;
            index++;
            coord1 = new coordenadas(2, 1);
            tab.pullFichaV2(piezasEnTablero[7]);
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0], coord1, 8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            //Console.WriteLine("So far[" + index + "]: " + (cantSoluciones - guardo));
            guardo = cantSoluciones;
            index++;
            coord1 = new coordenadas(1, 2);
            tab.pullFichaV2(piezasEnTablero[7]);
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0], coord1, 8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            //Console.WriteLine("So far[" + index + "]: " + (cantSoluciones - guardo));
            guardo = cantSoluciones;
            index++;
            coord1 = new coordenadas(2, 2);
            tab.pullFichaV2(piezasEnTablero[7]);
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0], coord1, 8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            //Console.WriteLine("So far[" + index + "]: " + (cantSoluciones - guardo));
            guardo = cantSoluciones;
            index++;
            coord1 = new coordenadas(1, 3);
            tab.pullFichaV2(piezasEnTablero[7]);
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0], coord1, 8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            //Console.WriteLine("So far[" + index + "]: " + (cantSoluciones - guardo));
            guardo = cantSoluciones;
            index++;
            coord1 = new coordenadas(2, 3);
            tab.pullFichaV2(piezasEnTablero[7]);
            piezasEnTablero[7] = tab.putFichaV2(fig.getPosiciones()[0], coord1, 8);
            Backtracking.backtracking(tab, coord, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
            //Console.WriteLine("So far[" + index + "]: " + (cantSoluciones - guardo));
            guardo = cantSoluciones;
            index++;



            Console.WriteLine("END OF BACKTRACKING, FINAL RESULT IS: " + cantSoluciones);
            /*foreach(String sol in soluciones)
            {
                Console.WriteLine("");
            }
            Console.Read();*/
            
            /*
            Tablero tab = new Tablero();
            for (int figid = 1; figid < 13; figid++)
            {
                figura fig = new figura(figid);
                coordenadas[][] posiciones = fig.getPosiciones();
                for (int i = 0; i < posiciones.Length; i++)
                {
                    coordenadas coor = new coordenadas(0, 0);

                    coordenadas[] posicionFicha = tab.putFichaV2(posiciones[i], coor, figid);
                    Backtracking.printFig(posiciones[i]);
                    Console.WriteLine("*****************");
                    //tab.printTab();
                    if (posicionFicha != null)
                        tab.pullFichaV2(posicionFicha);
                    //tab.printTab();
                    Console.Write("");
                }
            }
            */
            
            Console.Read();
        }
             




    }
}
